package com.itzhoun;

/**
 * 懒加载 为了避免内存被浪费，可以在创建对象的时候在加载
 * 优点：内存不会被浪费
 * 缺点：if判断及其内存执行不是原子性的，其次 new LazySingleton()无法保证执行的顺序 因此线程是不安全的
 * @author 周楠
 * @Date 2023/01/07/上午 10:24
 */
public class LazySingleton {

    public static LazySingleton lazySingleton = null;

    public LazySingleton() {
        // TODO document why this constructor is empty
    }

    public static LazySingleton getInstance(){
        if (lazySingleton == null){
            lazySingleton = new LazySingleton();
        }
        return lazySingleton;
    }

    /**
     * new LazySingleton()为何会使线程不安全？
     * 首先 创建对象分三步： 1、初始化内存空间 2、初始化对象 3、设置instance指向刚分配的内存地址
     * 其次 jvm为了提高程序执行性能，会对没有依赖关系的代码进行重新排序，那么 2和3可能会被重新排序
     *           t1         t2                            t3                     t4                 t5       t6
     * 线程A   分配内存空间   设置instance指向内存空间                                                  初始化对象   设置instance对象
     * 线程B                                            判断instance不为空        instance不为空 访问instance对象
     * 由上看出线程不安全
     */

}
